﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using Tst.Models;
using Ext.Direct.Mvc;
using System.Web.Security;

namespace Tst.Controllers
{
    public class UsuarioController : Controller
    {
        private UsuarioRepository usuarioRep;

        public UsuarioController()
        {
            this.usuarioRep = new UsuarioRepository();
        }

        public ActionResult List()
        {
            return this.Direct(this.usuarioRep.GetAll());
        }

        [FormHandler]
        public ActionResult Create(FormCollection request)
        {
            //valida se o login já existe
            Usuario usuario = this.usuarioRep.GetByLogin(request.GetString("ds_login"));

            if (usuario != null && usuario.cd_usuario != request.GetInteger("cd_usuario"))
            {
                return this.Direct(new
                {
                    success = false,
                    errors = new
                    {                        
                        ds_login = "Login já cadastrado no sistema. Favor informe outro"
                    }
                });
            }

            //so administrador mexe no seu cadastro
            if (usuario != null && usuario.ds_tipo.Equals("Administrador") && !Roles.IsUserInRole("Administrador"))
            {
                return this.Direct(new
                {
                    success = false,
                    errors = new
                    {
                        ds_login = "Somente o administrador pode alterar seu cadastro."
                    }
                });
            }

            //novo registro
            if (String.IsNullOrEmpty(request["cd_usuario"]))
            {
                usuario = new Usuario()
                {
                    bit_ativo = request.GetBoolen("bit_ativo"),
                    ds_login = request.GetString("ds_login"),
                    ds_nome = request.GetString("ds_nome"),
                    ds_senha = request.GetString("ds_senha"),
                    ds_tipo = "Testador",//request.GetString("ds_tipo"),
                    Permissoes = new UsuarioPermissao()
                    {                                    
                        bit_cad_ambiente = request.GetBoolen("bit_cad_ambiente"),
                        bit_cad_cas_teste = request.GetBoolen("bit_cad_cas_teste"),
                        bit_cad_pl_execucao = request.GetBoolen("bit_cad_pl_execucao"),
                        bit_cad_pl_teste = request.GetBoolen("bit_cad_pl_teste"),
                        bit_cad_projeto = request.GetBoolen("bit_cad_projeto"),
                        bit_cad_tp_erro = request.GetBoolen("bit_cad_tp_erro"),
                        bit_vis_dash = request.GetBoolen("bit_vis_dash"),
                        bit_vis_rel = request.GetBoolen("bit_vis_rel"),                   
                    }
                };

                this.usuarioRep.Insert(usuario);
            }
            else //atualização
            {
                usuario = this.usuarioRep.GetById(Convert.ToInt16(request["cd_usuario"]));
                usuario.PermissoesReference.Load();

                //altera senha
                if(!String.IsNullOrEmpty(request.GetString("ds_senha")))
                {
                    usuario.ds_senha = request.GetString("ds_senha");
                }

                usuario.ds_nome = request.GetString("ds_nome");

                if (!usuario.ds_login.Equals("admin"))
                {
                    usuario.bit_ativo = request.GetBoolen("bit_ativo");
                    usuario.ds_login = request.GetString("ds_login");
                    usuario.ds_tipo = request.GetString("ds_tipo");
  
                    usuario.Permissoes.bit_cad_ambiente = request.GetBoolen("bit_cad_ambiente");
                    usuario.Permissoes.bit_cad_cas_teste = request.GetBoolen("bit_cad_cas_teste");
                    usuario.Permissoes.bit_cad_pl_execucao = request.GetBoolen("bit_cad_pl_execucao");
                    usuario.Permissoes.bit_cad_pl_teste = request.GetBoolen("bit_cad_pl_teste");
                    usuario.Permissoes.bit_cad_projeto = request.GetBoolen("bit_cad_projeto");
                    usuario.Permissoes.bit_cad_tp_erro = request.GetBoolen("bit_cad_tp_erro");
                    usuario.Permissoes.bit_vis_dash = request.GetBoolen("bit_vis_dash");
                    usuario.Permissoes.bit_vis_rel = request.GetBoolen("bit_vis_rel");
                }

                this.usuarioRep.Update(usuario);
            }

            this.usuarioRep.Save();

            return this.Direct(new
            {
                success = true,
                cd_usuario = usuario.cd_usuario
            });
        }

        public ActionResult Delete(int cd_usuario)
        {         
            this.usuarioRep.Delete(cd_usuario);
            this.usuarioRep.Save();

            return this.Direct(new { success = true });
        }

        public ActionResult Habilitar(int cd_usuario, bool bit_ativo)
        {
            Usuario usuario = this.usuarioRep.GetById(cd_usuario);

            if (usuario == null)
            {
                return this.Direct(new { success = false, message = "Usuário não encontrado" });
            }

            usuario.bit_ativo = bit_ativo;
            this.usuarioRep.Update(usuario);
            this.usuarioRep.Save();

            return this.Direct(new { success= true });
        }
    }
}
